package com.iamteer.day15;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;


/**
主要回顾：List 接口
集合体系：
--------| Collection	单列集合的根接口
------------| List	如果实现了 List 接口的集合类，具备的特点：有序，可重复
----------------| ArrayList		底层维护一个 Object 数组，查询快，增删慢（如高校图书馆：查询多，增删少）
----------------| LinkedList	底层使用链表数据结构实现，查询慢，增删快
----------------| Vector		底层维护一个 Object 数组，但线程安全

------------| Set	如果实现了 Set 接口的集合类，具备的特点：无序，不可重复


List：
		有序：指添加进去的顺序与元素出来的顺序是一致的
		可重复：可以重复添加
		只有 List 接口下面的集合才有索引值
	
List 方法：
	添加
		add(int index, E element);
		addAll(int index, Collection<? extends E> c);
	
	获取
		get(int index);
		indexOf(Object o);
		lastIndexOf(Object o);
		subList(int fromIndex, int toIndex);
		
	修改
		set(int index, E element);
		
	迭代：在迭代过程中，不用使用集合对象方法改变元素的个数，要改变只能使用迭代器的方法进行操作
		listIterator();
			hasNext();		//是否存在下一个元素
			next();			//获取元素，先获取，再移动指针
			
			hasPrevious();	//是否存在上一个元素
			previous();		//获取元素，先移动指针，再获取
			
			add(E e);		//把元素插入到当前指针指向的位置
			set(E e);		//替代迭代器最后返回的元素
			
------------------------------------------------------------------------------------------------------		
1. ArrayList
	1.1 特有的方法：
		ensureCapacity(int minCapacity);	//一般用带参构造方法而不用这方法
		trimToSize();	//去掉空的
	
	1.2 使用 ArrayList 无参的构造函数创建一个对象时，默认的容量是多少？如果长度不够用时自动增长多少？
		ArrayList 底层维护了 Object 数组，使用无参构造函数时，Object 数组默认的容量是 10，当长度不够用时，自动增长 0.5 倍。
	
	1.3 ArrayList 与 Vector 的区别？
		相同：ArrayList 与 Vector 底层都使用了 Object 数组实现
		不同点：
			1.3.1 ArrayList 是线程不同步的，操作效率高；Vector 是线程同步的，操作效率低
			1.3.2 ArrayList 是 JDK1.2 出现的，而 Vector 是 JDK1.0 出现的。
			
------------------------------------------------------------------------------------------------------	
2. LinkedList
	2.1 特有方法：
		addFirst(E e);
		addLast(E e);
		getFirst();
		getLast();
		removeFirst();
		removeLast();
	
	2.2 数据结构：
		2.2.1 栈（先进后出）：主要用于实现堆栈数据结构的存储方式
			push();
			pop();
		2.2.2 队列（先进先出）：主要用于实现队列数据结构的存储方式
			offer();
			poll();
	2.3 逆序迭代对象
		descendingIterator();
		
------------------------------------------------------------------------------------------------------		
3. Vector
	
 */
public class LearnList {
	
	public static void main(String[] args) {
//		arrayList();	//演示 ArrayList 方法
//		linkedList();	//演示 LinkedList 方法
		vector();		//演示 Vector 方法
	}
	
	//演示 ArrayList 方法
	public static void arrayList() {
		List list = new ArrayList();
		//添加元素
		list.add("狗娃");
		list.add("狗剩");
		list.add("铁蛋");
		
		//添加元素到指定位置
		list.add(1, "本山");
		
		List list2 = new ArrayList();
		list2.add("张三");
		list2.add("李四");
		
		//添加集合
		list.addAll(list2);
		list.addAll(2, list2);
		
		System.out.println(list);	
		
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
		
		System.out.println(list.indexOf("张三"));
		System.out.println(list.lastIndexOf("张三"));
		
		List subList = list.subList(0, 5);
		System.out.println(subList);
		
		list.set(0, "李狗娃");
		System.out.println(list);
		
		ListIterator listIterator = list.listIterator();
		 listIterator.add("王五");	//会插入到最前面（因为当前指针指向最前）
		//顺序遍历集合
		while (listIterator.hasNext()) {
			listIterator.next();
//			list.add("aa");			//报错：不用使用集合对象方法改变集合个数
//			listIterator.add("aa");	//要使用只能使用迭代器的方法
		}
		listIterator.set("李阿四");	//修改当前的元素（就是最后一个：李四）
		//逆序遍历集合
		while (listIterator.hasPrevious()) {
			System.out.println(listIterator.previous());
		}
	}
	
	//演示 LinkedList 方法
	public static void linkedList() {
		LinkedList ll = new LinkedList();
		
		//添加元素
		ll.add("张三");
		ll.add("李四");
		ll.add("王五");
		
		ll.addFirst("狗娃");		//添加到集合的位置
		ll.addLast("狗剩");		//添加到集合的结尾
		
		System.out.println(ll);	//输出集合元素
		
		System.out.println(ll.removeFirst());	//删除首个元素
		System.out.println(ll.removeLast());	//删除最后一个元素
		System.out.println(ll);
		
		ll.push("狗娃");		//将该元素插入到集合首位置
		System.out.println( ll.pop() );	//移除并返回集合中的第一个元素
		System.out.println(ll);
		
		ll.offer("狗剩");	//将该元素插入到集合末位置
		System.out.println( ll.poll() );	//删除集合的首元素并返回
		System.out.println(ll);
		
		Iterator iterator = ll.descendingIterator();
		while (iterator.hasNext()) {
			System.out.println(iterator.next());
		}
		
	}

	//演示 Vector 方法——基本可以用 ArrayList 代替
	public static void vector() {
		Vector vector = new Vector();
		
		vector.addElement("张三");
		vector.addElement("李四");
		vector.addElement("王五");
		
		System.out.println(vector);
	}
}
